package com.zenithmind.document.mapper;

import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.zenithmind.document.pojo.domain.DocumentRating;
import com.zenithmind.document.pojo.query.DocumentRatingQueryDTO;
import com.zenithmind.document.pojo.vo.DocumentRatingVO;
import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Param;

import java.util.List;

/**
 * 文档评分映射器
 * 遵循单一职责原则：专注于文档评分数据访问
 * 遵循依赖倒置原则：定义抽象的数据访问接口
 * 
 * @author ZenithMind Team
 * @since 2025-01-09
 */
@Mapper
public interface DocumentRatingMapper extends BaseMapper<DocumentRating> {

    /**
     * 分页查询评分详情
     * 
     * @param page 分页参数
     * @param queryDTO 查询条件
     * @return 分页结果
     */
    IPage<DocumentRatingVO> selectRatingPageWithDetails(Page<DocumentRatingVO> page, @Param("query") DocumentRatingQueryDTO queryDTO);

    /**
     * 查询文档评分列表
     * 
     * @param documentId 文档ID
     * @param limit 限制数量
     * @return 评分列表
     */
    List<DocumentRatingVO> selectDocumentRatings(@Param("documentId") String documentId, @Param("limit") Integer limit);

    /**
     * 查询用户评分列表
     * 
     * @param userId 用户ID
     * @param limit 限制数量
     * @return 评分列表
     */
    List<DocumentRatingVO> selectUserRatings(@Param("userId") String userId, @Param("limit") Integer limit);

    /**
     * 查询文档平均评分
     * 
     * @param documentId 文档ID
     * @return 平均评分
     */
    Double selectDocumentAverageRating(@Param("documentId") String documentId);

    /**
     * 查询文档评分统计
     * 
     * @param documentId 文档ID
     * @return 评分统计
     */
    Object selectDocumentRatingStatistics(@Param("documentId") String documentId);

    /**
     * 检查用户是否已评分
     * 
     * @param documentId 文档ID
     * @param userId 用户ID
     * @return 是否已评分
     */
    Boolean checkUserRated(@Param("documentId") String documentId, @Param("userId") String userId);

    /**
     * 查询用户对文档的评分
     * 
     * @param documentId 文档ID
     * @param userId 用户ID
     * @return 用户评分
     */
    DocumentRatingVO selectUserDocumentRating(@Param("documentId") String documentId, @Param("userId") String userId);

    /**
     * 查询用户对文档的评分实体
     * 
     * @param documentId 文档ID
     * @param userId 用户ID
     * @return 评分实体
     */
    DocumentRating selectUserDocumentRatingEntity(@Param("documentId") String documentId, @Param("userId") String userId);

    /**
     * 删除用户评分
     * 
     * @param documentId 文档ID
     * @param userId 用户ID
     * @return 影响行数
     */
    Integer deleteUserRating(@Param("documentId") String documentId, @Param("userId") String userId);

    /**
     * 查询评分分布
     * 
     * @param documentId 文档ID
     * @return 评分分布
     */
    List<Object> selectRatingDistribution(@Param("documentId") String documentId);

    /**
     * 查询热门评分文档
     * 
     * @param limit 限制数量
     * @return 文档列表
     */
    List<Object> selectTopRatedDocuments(@Param("limit") Integer limit);

    /**
     * 查询最新评分
     * 
     * @param limit 限制数量
     * @return 评分列表
     */
    List<DocumentRatingVO> selectLatestRatings(@Param("limit") Integer limit);

    /**
     * 查询评分趋势
     * 
     * @param documentId 文档ID
     * @param days 统计天数
     * @return 趋势数据
     */
    List<Object> selectRatingTrend(@Param("documentId") String documentId, @Param("days") Integer days);

    /**
     * 搜索评分
     * 
     * @param keyword 关键词
     * @param limit 限制数量
     * @return 评分列表
     */
    List<DocumentRatingVO> searchRatings(@Param("keyword") String keyword, @Param("limit") Integer limit);

    /**
     * 查询评分评论
     * 
     * @param documentId 文档ID
     * @param hasComment 是否有评论
     * @param limit 限制数量
     * @return 评分列表
     */
    List<DocumentRatingVO> selectRatingComments(@Param("documentId") String documentId, @Param("hasComment") Boolean hasComment, @Param("limit") Integer limit);

    /**
     * 点赞评分
     * 
     * @param ratingId 评分ID
     * @param userId 用户ID
     * @return 影响行数
     */
    Integer likeRating(@Param("ratingId") String ratingId, @Param("userId") String userId);

    /**
     * 取消点赞评分
     * 
     * @param ratingId 评分ID
     * @param userId 用户ID
     * @return 影响行数
     */
    Integer unlikeRating(@Param("ratingId") String ratingId, @Param("userId") String userId);

    /**
     * 举报评分
     * 
     * @param ratingId 评分ID
     * @param userId 用户ID
     * @param reason 举报原因
     * @return 影响行数
     */
    Integer reportRating(@Param("ratingId") String ratingId, @Param("userId") String userId, @Param("reason") String reason);

    /**
     * 审核评分
     * 
     * @param ratingId 评分ID
     * @param status 审核状态
     * @param reviewerId 审核人ID
     * @return 影响行数
     */
    Integer reviewRating(@Param("ratingId") String ratingId, @Param("status") Integer status, @Param("reviewerId") String reviewerId);

    /**
     * 批量审核评分
     * 
     * @param ratingIds 评分ID列表
     * @param status 审核状态
     * @param reviewerId 审核人ID
     * @return 影响行数
     */
    Integer batchReviewRatings(@Param("ratingIds") List<String> ratingIds, @Param("status") Integer status, @Param("reviewerId") String reviewerId);

    /**
     * 查询待审核评分
     * 
     * @param limit 限制数量
     * @return 评分列表
     */
    List<DocumentRatingVO> selectPendingReviewRatings(@Param("limit") Integer limit);

    /**
     * 导出评分数据
     * 
     * @param queryDTO 查询条件
     * @return 导出数据
     */
    Object exportRatings(@Param("query") DocumentRatingQueryDTO queryDTO);

    /**
     * 同步评分统计
     * 
     * @param documentId 文档ID
     * @return 影响行数
     */
    Integer syncRatingStatistics(@Param("documentId") String documentId);

    /**
     * 清理垃圾评分
     * 
     * @return 清理数量
     */
    Integer cleanupSpamRatings();

    /**
     * 查询评分质量分析
     * 
     * @param documentId 文档ID
     * @return 质量分析
     */
    Object selectRatingQualityAnalysis(@Param("documentId") String documentId);

    /**
     * 查询用户评分行为分析
     * 
     * @param userId 用户ID
     * @return 行为分析
     */
    Object selectUserRatingBehavior(@Param("userId") String userId);

    /**
     * 查询相似评分文档
     * 
     * @param documentId 文档ID
     * @param limit 限制数量
     * @return 文档列表
     */
    List<Object> selectSimilarRatedDocuments(@Param("documentId") String documentId, @Param("limit") Integer limit);

    /**
     * 查询评分标签统计
     * 
     * @param documentId 文档ID
     * @return 标签统计
     */
    List<Object> selectRatingTagStatistics(@Param("documentId") String documentId);

    /**
     * 批量插入评分
     * 
     * @param ratings 评分列表
     * @return 插入数量
     */
    Integer batchInsertRatings(@Param("list") List<DocumentRating> ratings);

    /**
     * 查询评分热力图
     * 
     * @param documentId 文档ID
     * @param days 统计天数
     * @return 热力图数据
     */
    List<Object> selectRatingHeatmap(@Param("documentId") String documentId, @Param("days") Integer days);

    /**
     * 查询评分情感分析
     * 
     * @param documentId 文档ID
     * @return 情感分析数据
     */
    Object selectRatingSentimentAnalysis(@Param("documentId") String documentId);

    /**
     * 查询评分关键词
     * 
     * @param documentId 文档ID
     * @param limit 限制数量
     * @return 关键词列表
     */
    List<Object> selectRatingKeywords(@Param("documentId") String documentId, @Param("limit") Integer limit);

    /**
     * 查询评分对比
     * 
     * @param documentId1 文档1 ID
     * @param documentId2 文档2 ID
     * @return 对比数据
     */
    Object selectRatingComparison(@Param("documentId1") String documentId1, @Param("documentId2") String documentId2);

    /**
     * 查询评分预测
     * 
     * @param documentId 文档ID
     * @param days 预测天数
     * @return 预测数据
     */
    Object selectRatingPrediction(@Param("documentId") String documentId, @Param("days") Integer days);

    /**
     * 查询评分异常检测
     * 
     * @param documentId 文档ID
     * @return 异常数据
     */
    List<Object> selectRatingAnomalies(@Param("documentId") String documentId);

    /**
     * 查询评分影响因子
     * 
     * @param documentId 文档ID
     * @return 影响因子数据
     */
    Object selectRatingInfluenceFactors(@Param("documentId") String documentId);
}
